perm filename HAL.PAL[HAL,HE]4 blob
sn#158951 filedate 1975-05-13 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00003 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 .TITLE AL INTERPRETER
C00004 00003 program initialization
C00014 ENDMK
C⊗;
.TITLE AL INTERPRETER
.INSRT HALHED.PAL[HAL,HE]
STSW FLOAT,0 ;1 => put in the floating-string conversions
STSW SMALLB,0 ;1 => use the small block routines
STSW ONMONS,1 ;1 => put in condition monitors
STSW GRAPHS,1 ;1 => put in graph structure
STSW MOVING,0 ;1 => put in the servo
STSW INTLOAD,1 ;1 => put in the interpreter
STSW SNGSTP,1 ;1 => servo in single step mode, wont call scheduler
STSW DIAGY,0 ;1 => servo in diagnostic mode, saves jnt vars in DBUF
.INSRT KDEF.PAL[11,SYS]
.INSRT HALIO.PAL[HAL,HE]
.INSRT LARGEB.PAL[HAL,HE]
.IFNZ SMALLB
.INSRT SMALLB.PAL[HAL,HE]
.ENDC
.IFNZ INTLOAD
.INSRT INTERP.PAL[HAL,HE]
.INSRT ARITH.PAL[HAL,HE]
.ENDC
.IFNZ GRAPHS
.INSRT GRAPHS.PAL[HAL,HE]
.ENDC
.IFNZ MOVING
.INSRT ARM.PAL[11,BES]
.INSRT ARMSOL.PAL[11,BES]
.ENDC
INSTRT = 41000
;Data areas
.BLKW 100 ;Stack
STACK: .BLKW 1 ;
ISTBLK: .BLKW ISBS ;Interpreter status block
ENVIRO: .BLKW 100 ;Environment
INSTCK: .BLKW INSTSZ ;Interpreter Stack
PDBLK MAINBL,100,S ;Makes a process descriptor for main process
PUTLOC JOBDAT, MAINBL
PUTLOC JOBSA, START
PUTLOC JOBPDL, STACK
; program initialization
PDBSTA == 40 ;Process Descriptor Block Status Word
PDBR0 == 60 ;Where R0 is saved
PDBR1 == 62 ;Where R1 is saved
PDBR2 == 64 ;Where R2 is saved
PDBR3 == 66 ;Where R3 is saved
PDBR4 == 70 ;Where R4 is saved
PDBR5 == 72 ;Where R5 is saved
PDBSP == 74 ;Where SP is saved
PDBPC == 76 ;Where PC is saved
PDBSSV == 104 ;Process Descriptor Block Stack Save Length Word
START:
MOV #STACK,R3 ;Set up argument stack
JSR PC,FRINIT ;Initialize free storage
.IFNZ INTLOAD ;Initialize the interpreter
EVMAK ;-(SP) ← event
MOV #ISBS,R0 ;R0 ← Size (in words) of an interpreter status block
JSR PC,GTFREE ;R0 ← LOC[new interpreter status block]
CLR LEV(R0) ;new LEV ← 0
MOV #INSTRT,IPC(R0) ;new IPC ← interpreter start address
MOV #ENVIRO,ENV(R0) ;new ENV ← ENVIRO
MOV (SP),EVT(R0);new EVT ← event just created.
MOV R0,-(SP) ;Save LOC[new interpreter status block]
MOV #INSTSZ,R0 ;R0 ← Size needed for an interpreter stack
JSR PC,GTFREE ;R0 ← LOC[new interpreter stack]
MOV (SP)+,R1 ;R1 ← LOC[new interpreter status block]
MOV R0,STKBAS(R1) ;Store away new stack base
ADD #2*INSTSZ,R0 ;R0 ← LOC[top of new stack] (INSTSZ is in bytes)
MOV R1,-(SP) ;Save R1
MOV R0,-(SP) ;Save R0
MOV #210,R0 ;Room for process descriptor
JSR PC,GTFREE ;R0 ← LOC[new process descriptor]
MOV #UFPUSE+UGPSAV,PDBSTA(R0);Use floating point, use saved registers.
MOV #100,PDBSSV(R0) ;Length of stack to be saved.
MOV (SP)+,R1 ;R1 ← LOC[new interpreter stack top]
MOV R1,PDBR3(R0) ;Store away new interp stack pointer (reg 3)
MOV (SP)+,R1 ;R1 ← LOC[new ISB]
MOV R0,PCB(R1) ;Store away LOC[PCB] in new ISB
MOV R1,PDBR4(R0) ;Store away LOC[ISB] in reg 4 of PCB
MOV SP,R1 ;
TST (R1)+ ;
MOV R1,PDBSP(R0) ;Store away the new stack pointer (reg 6)
MOV #INTERP,PDBPC(R0);Store away the new PC
ADD #PDBSTA,R0 ;Move R0 to the middle of the process descriptor
SCHEDU R0,#INTERP,#0,#2;Cause the new process to be started, suspended
EVWAIT (SP) ;Wait for the return signal
BCC TST1 ;All well?
HALERR TSTMES ;No
TST1: OUTSTR TSTME1 ;Say farewell
DISMIS ;Go away
TSTMES: ASCIE </
BAD RETURN FROM MAIN INTERPRETER
/>
TSTME1: ASCIE </
ALL DONE NOW. SEE YOU AROUND!
/>
;End of the interpreter calling sequence
.IFF ;do some test without the iterpreter
JMP FSTEST ;Try out the test routine for small blocks.
.ENDC
PATCH: .BLKW 100
.IF2
FOO==.
.INFO <First location after interpreter = >,\FOO
.IFL 44000-FOO
.ERR Interpreter too long
.ENDC
.ENDC
.END